import 'dart:async';

import 'package:enterprise_v6_app/app/components/toast_widget.dart';
import 'package:enterprise_v6_app/app/core/http/http.dart';
import 'package:enterprise_v6_app/app/core/utils/interface.dart';
import 'package:enterprise_v6_app/app/core/utils/log_util.dart';
import 'package:enterprise_v6_app/app/core/utils/user_manager.dart';
import 'package:enterprise_v6_app/app/data/entities/task/scheduling_config_entity.dart';
import 'package:enterprise_v6_app/app/modules/application/controller.dart';
import 'package:enterprise_v6_app/router/app_pages.dart';
import 'package:get/get.dart';
import 'package:jiffy/jiffy.dart';
/// 我的任务-打卡
class ClockInController extends GetxController {
  /// 当前时间
  String currentTime = '';

  /// 计时器
  late Timer _timer;

  /// 今日排班计划
  List<SchedulingConfigEntity> planList = [];

  /// 当前选中计划
  SchedulingConfigEntity currentPlan = SchedulingConfigEntity();

  ///	app打卡状态：1-上班卡 2-下班卡 3-请假
  int appClockStatus = -1;

  @override
  void onInit() {
    super.onInit();
    // 未登录不执行操作
    if (!UserManager.isLoggedIn) {
      return;
    }
    // 获取当天打卡列表
    getDailyPlan();
    // 开启计时器
    _startTimer();
  }

  @override
  void dispose() {
    _timer.cancel();
    super.dispose();
  }

  /// 获取当日值班计划
  Future<void> getDailyPlan() async {
    // 未登录不执行操作
    if (!UserManager.isLoggedIn) {
      return;
    }
    final DateTime now = DateTime.now(); // 获取当前日期和时间
    final DateTime todayStart = DateTime(now.year, now.month, now.day, 0, 0, 0); // 当日的开始时间
    final DateTime todayEnd = DateTime(now.year, now.month, now.day, 23, 59, 59); // 当日的结束时间

    final response = await HttpUtil().generateGetRequest<List<SchedulingConfigEntity>>(Interface.getUserDutyList, queryParameters: {
      'startDate': Jiffy.parseFromDateTime(todayStart).format(pattern: 'yyyy-MM-dd HH:mm:ss'),
      'endDate': Jiffy.parseFromDateTime(todayEnd).format(pattern: 'yyyy-MM-dd HH:mm:ss'),
    }).execute();

    response.onSuccess((result) {
      if (result.data != null) {
        planList = result.data!;
        if (planList.isNotEmpty) {
          currentPlan = planList[0];
        }
        update();
      }
    });
  }

  /// 选择执行的班次
  void selectPlan(SchedulingConfigEntity entity) {
    currentPlan = entity;
    update();
  }

  /// 打卡显示判断
  String? canCheckIn() {
    appClockStatus = -1;
    String? value;
    try {
      // 请假备注有数据表示已请假
      if (currentPlan.askForLeave.isNotEmpty) {
        return value;
      }
      // 如果上班、下班都已经打卡则不能打卡
      if (currentPlan.classesBeginDateRecord.isNotEmpty && currentPlan.classesEndDateRecord.isNotEmpty) {
        return value;
      }
      // 将目标时间字符串解析为DateTime对象
      // 计划上班时间
      final DateTime startTime = DateTime.parse(currentPlan.classesBeginDate);
      // 计划下班时间
      final DateTime endTime = DateTime.parse(currentPlan.classesEndDate);
      // 如果目前时间在上班时间之前且没有打卡
      if (DateTime.now().isBefore(startTime) && currentPlan.classesBeginDateRecord.isEmpty) {
        appClockStatus = 1;
        return '上班打卡';
      }
      // 如果目前时间在下班时间之后且没有打卡
      if (DateTime.now().isAfter(endTime) && currentPlan.classesEndDateRecord.isEmpty) {
        appClockStatus = 2;
        return '下班打卡';
      }
      // 如果目前在上班时间和下班之间且没有打上班卡
      if (DateTime.now().isAfter(startTime) && DateTime.now().isBefore(endTime) && currentPlan.classesBeginDateRecord.isEmpty) {
        return '无法打卡';
      }
    } catch (e) {
      AppLogger.printLog(e.toString());
    }
    return value;
  }

  /// 点击打卡按钮
  void clickCheckIn() {
    if (appClockStatus == -1) {
      AppToast.showWarning('当前不在打卡时段!');
      return;
    }
    // 跳转到打卡页面
    Get.toNamed(AppRoutes.checkInPage, arguments: {'appClockStatus': appClockStatus});
  }

  /// 是否显示请假按钮
  bool isShowLeave() {
    // 请假备注有数据表示已请假
    if (currentPlan.askForLeave.isNotEmpty) {
      return false;
    }
    // 计划上班时间
    final DateTime startTime = DateTime.parse(currentPlan.classesBeginDate);
    // 如果目前时间在上班时间之前且没有打卡
    if (DateTime.now().isBefore(startTime) && currentPlan.classesBeginDateRecord.isEmpty) {
      return true;
    }
    return false;
  }

  /// 开启计时器
  void _startTimer() {
    _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
      currentTime = Jiffy.parseFromDateTime(DateTime.now()).format(pattern: 'HH:mm:ss');
      update();
    });
  }

  /// 获取当前位置
  String getCurrentLocation() {
    //外部controller
    final applyController = Get.find<ApplyController>();
    if (UserManager.isLoggedIn && applyController.currentPlace != null) {
      return applyController.currentPlace!.name ?? '';
    }
    return '';
  }
}
